// noinspection JSUnresolvedReference
/**
* Field Google Map
*/
/* global jQuery, document, redux_change, redux, google */
(function ( $ ) {
'use strict';
redux.field_objects = redux.field_objects || {};
redux.field_objects.google_maps = redux.field_objects.google_maps || {};
/* LIBRARY INIT */
redux.field_objects.google_maps.init = function ( selector ) {
if ( ! selector ) {
selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' );
}
$( selector ).each(
function ( i ) {
let delayRender;
const el = $( this );
let parent = el;
if ( ! el.hasClass( 'redux-field-container' ) ) {
parent = el.parents( '.redux-field-container:first' );
}
if ( parent.is( ':hidden' ) ) {
return;
}
if ( parent.hasClass( 'redux-field-init' ) ) {
parent.removeClass( 'redux-field-init' );
} else {
return;
}
// Check for delay render, which is useful for calling a map
// render after JavaScript load.
delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) );
// API Key button.
redux.field_objects.google_maps.clickHandler( el );
// Init our maps.
redux.field_objects.google_maps.initMap( el, i, delayRender );
}
);
};
/* INIT MAP FUNCTION */
redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) {
let delayed;
let scrollWheel;
let streetView;
let mapType;
let address;
let defLat;
let defLong;
let defaultZoom;
let mapOptions;
let geocoder;
let g_autoComplete;
let g_LatLng;
let g_map;
let noLatLng = false;
// Pull the map class.
const mapClass = el.find( '.redux_framework_google_maps' );
const containerID = mapClass.attr( 'id' );
const autocomplete = containerID + '_autocomplete';
const canvas = containerID + '_map_canvas';
const canvasId = $( '#' + canvas );
const latitude = containerID + '_latitude';
const longitude = containerID + '_longitude';
// Add map index to data attr.
// Why, say we want to use delay_render,
// and want to init the map later on.
// You'd need the index number in the
// event of multiple map instances.
// This allows one to retrieve it
// later.
$( mapClass ).attr( 'data-idx', idx );
if ( true === delayRender ) {
return;
}
// Map has been rendered, no need to process again.
if ( $( '#' + containerID ).hasClass( 'rendered' ) ) {
return;
}
// If a map is set to delay render and has been initiated
// from another scrip, add the 'render' class so rendering
// does not occur.
// It messes things up.
delayed = Boolean( mapClass.data( 'delay-render' ) );
if ( true === delayed ) {
mapClass.addClass( 'rendered' );
}
// Create the autocomplete object, restricting the search
// to geographical location types.
g_autoComplete = await google.maps.importLibrary( 'places' );
g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} );
// Data bindings.
scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) );
streetView = Boolean( mapClass.data( 'street-view' ) );
mapType = Boolean( mapClass.data( 'map-type' ) );
address = mapClass.data( 'address' );
address = decodeURIComponent( address );
address = address.trim();
// Set default Lat/lng.
defLat = canvasId.data( 'default-lat' );
defLong = canvasId.data( 'default-long' );
defaultZoom = canvasId.data( 'default-zoom' );
// Eval whether to set maps based on lat/lng or address.
if ( '' !== address ) {
if ( '' === defLat || '' === defLong ) {
noLatLng = true;
}
} else {
noLatLng = false;
}
// Can't have empty values, or the map API will complain.
// Set default for the middle of the United States.
defLat = defLat ? defLat : 39.11676722061108;
defLong = defLong ? defLong : -100.47761000000003;
if ( noLatLng ) {
// If displaying a map based on an address.
geocoder = new google.maps.Geocoder();
// Set up Geocode and pass address.
geocoder.geocode(
{'address': address},
function ( results, status ) {
let latitude;
let longitude;
// Function results.
if ( status === google.maps.GeocoderStatus.OK ) {
// A good address was passed.
g_LatLng = results[0].geometry.location;
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom,
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
// Get and set lat/long data.
latitude = el.find( '#' + containerID + '_latitude' );
latitude.val( results[0].geometry.location.lat() );
longitude = el.find( '#' + containerID + '_longitude' );
longitude.val( results[0].geometry.location.lng() );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
} else {
// No data found, alert the user.
alert( 'Geocode was not successful for the following reason: ' + status );
}
}
);
} else {
// If displaying map based on an lat/lng.
g_LatLng = new google.maps.LatLng( defLat, defLong );
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom, // Start off far unless an item is selected, set by php.
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create the map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
}
};
redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) {
let markerTooltip;
let infoWindow;
let g_marker;
let geoAlert = mapClass.data( 'geo-alert' );
// Get HTML.
const input = document.getElementById( autocomplete );
// Set objects into the map.
g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input );
// Bind objects to the map.
g_autoComplete = new google.maps.places.Autocomplete( input );
g_autoComplete.bindTo( 'bounds', g_map );
// Get the marker tooltip data.
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Create infoWindow.
infoWindow = new google.maps.InfoWindow();
// Create marker.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
draggable: true,
title: markerTooltip,
animation: google.maps.Animation.DROP
}
);
geoAlert = decodeURIComponent( geoAlert );
// Place change.
google.maps.event.addListener(
g_autoComplete,
'place_changed',
function () {
let place;
let address;
let markerTooltip;
infoWindow.close();
// Get place data.
place = g_autoComplete.getPlace();
// Display alert if something went wrong.
if ( ! place.geometry ) {
window.alert( geoAlert );
return;
}
console.log( place.geometry.viewport );
// If the place has a geometry, then present it on a map.
if ( place.geometry.viewport ) {
g_map.fitBounds( place.geometry.viewport );
} else {
g_map.setCenter( place.geometry.location );
g_map.setZoom( 17 ); // Why 17? Because it looks good.
}
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Set the marker icon.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
title: markerTooltip,
clickable: true,
draggable: true,
animation: google.maps.Animation.DROP
}
);
// Set marker position and display.
g_marker.setPosition( place.geometry.location );
g_marker.setVisible( true );
// Form array of address components.
address = '';
if ( place.address_components ) {
address = [( place.address_components[0] && place.address_components[0].short_name || '' ),
( place.address_components[1] && place.address_components[1].short_name || '' ),
( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' );
}
// Set the default marker info window with address data.
infoWindow.setContent( '
' + place.name + ' ' + address );
infoWindow.open( g_map, g_marker );
// Run Geolocation.
redux.field_objects.google_maps.geoLocate( g_autoComplete );
// Fill in address inputs.
redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete );
}
);
// Marker drag.
google.maps.event.addListener(
g_marker,
'drag',
function ( event ) {
document.getElementById( latitude ).value = event.latLng.lat();
document.getElementById( longitude ).value = event.latLng.lng();
}
);
// End marker drag.
google.maps.event.addListener(
g_marker,
'dragend',
function () {
redux_change( el.find( '.redux_framework_google_maps' ) );
}
);
// Zoom Changed.
g_map.addListener(
'zoom_changed',
function () {
el.find( '.google_m_zoom_input' ).val( g_map.getZoom() );
}
);
// Marker Info Window.
infoWindow = new google.maps.InfoWindow();
google.maps.event.addListener(
g_marker,
'click',
function () {
const marker_info = containerID + '_marker_info';
const infoValue = document.getElementById( marker_info ).value;
if ( '' !== infoValue ) {
infoWindow.setContent( infoValue );
infoWindow.open( g_map, g_marker );
}
}
);
};
/* FILL IN ADDRESS FUNCTION */
redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) {
// Set variables.
const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' );
// What if someone only wants city, or state, ect...
// gotta do it this way to check for the address!
// Need to check each of the returned components to see what is returned.
const componentForm = {
street_number: 'short_name',
route: 'long_name',
locality: 'long_name',
administrative_area_level_1: 'short_name',
country: 'long_name',
postal_code: 'short_name'
};
// Get the place details from the autocomplete object.
const place = g_autoComplete.getPlace();
let component;
let i;
let addressType;
let _d_addressType;
let val;
let len;
document.getElementById( latitude ).value = place.geometry.location.lat();
document.getElementById( longitude ).value = place.geometry.location.lng();
for ( component in componentForm ) {
if ( componentForm.hasOwnProperty( component ) ) {
// Push in the dynamic form element ID again.
component = containerID + '_' + component;
// Assign to proper place.
document.getElementById( component ).value = '';
document.getElementById( component ).disabled = false;
}
}
// Get each component of the address from the place details
// and fill the corresponding field on the form.
len = place.address_components.length;
for ( i = 0; i < len; i += 1 ) {
addressType = place.address_components[i].types[0];
if ( componentForm[addressType] ) {
// Push in the dynamic form element ID again.
_d_addressType = containerID + '_' + addressType;
// Get the original.
val = place.address_components[i][componentForm[addressType]];
// Assign to proper place.
document.getElementById( _d_addressType ).value = val;
}
}
};
redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) {
if ( navigator.geolocation ) {
navigator.geolocation.getCurrentPosition(
function ( position ) {
const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude );
const circle = new google.maps.Circle(
{
center: geolocation,
radius: position.coords.accuracy
}
);
g_autoComplete.setBounds( circle.getBounds() );
}
);
}
};
/* API BUTTON CLICK HANDLER */
redux.field_objects.google_maps.clickHandler = function ( el ) {
// Find the API Key button and react on click.
el.find( '.google_m_api_key_button' ).on(
'click',
function () {
// Find message wrapper.
const wrapper = el.find( '.google_m_api_key_wrapper' );
if ( wrapper.is( ':visible' ) ) {
// If the wrapper is visible, close it.
wrapper.slideUp(
'fast',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
} else {
// If the wrapper is visible, open it.
wrapper.slideDown(
'medium',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
}
}
);
el.find( '.google_m_autocomplete' ).on(
'keypress',
function ( e ) {
if ( 13 === e.keyCode ) {
e.preventDefault();
}
}
);
// Auto select autocomplete contents,
// since Google doesn't do this inherently.
el.find( '.google_m_autocomplete' ).on(
'click',
function ( e ) {
$( this ).trigger( 'focus' );
$( this ).trigger( 'select' );
e.preventDefault();
}
);
};
} )( jQuery );
Γρήγορα & ασφαλές καζίνο παιχνίδια με την εφαρμογή Cat Spins Casino παίξτε σήμερα! – Orchid Group Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Γρήγορες και ασφαλείς παιχνídια στο Cat Spins Casino: Τι χρειάζεστε για ένα ενοχλητικό παιχνίδι;
Γρήγορες και ασφαλείς παιχνídια στο Cat Spins Casino είναι το ídιο με την ασφάλεια και την ταχύτητα της σύνδεσης. Για να είστε ευέλικτοι στο Cat Spins Casino, χρειάζεστε μόνο ένα συνδεδεμένο λογαριασμό στο internet και μια συναδέρα που σας αρέσει.
Το Cat Spins Casino προσφέρει ένα ευέλικτο περιβάλλον χρήσης και πολυμεσικά ρεσουρς για να επιτύχετε ένα ανεπιστρέψιμο παιχνίδι.
Επιπλέον, το Cat Spins Casino προστατεύει τις πληροφορίες σας με την χρήση της κρυπτογράφησης 128-bit, ενσωματωμένης στην ιστοσελίδα.
Έτσι, μπορείτε να είστε βέβαιοι ότι οι πληροφορίες σας είναι ασφαλείς και μπορείτε να επιλέξετε μεταξύ πολλών ραπιδών παιχνιδιών χωρίς να υπάρχει καμία ενοχλητική αναμονή.
Πώς να ασφαλίσετε την ασφάλεια σας κατά τη χρήση της Cat Spins Casino εφαρμογής;
Πώς να ασφαλίσετε την ασφάλεια σας κατά τη χρήση της Cat Spins Casino εφαρμογής;
1. Εγκαταστήστε την εφαρμογή Cat Spins Casino μόνο από την ιστοσελίδα του καταστήματος ή από το λειτουργικό σας συστήματος αποθετήριο.
2. Δημιουργήστε ένα ασφαλές κωδικό πρόσβασης και μην το ανακοινώσετε κανενανuiς.
3. Ενεργοποιήστε την επαλήθευση της σύνδεσης για να προστατεύσετε το λογαριασμό σας.
4. Μην αποθηκεύετε πληροφορίες πρόσβασης στο πρόγραμμα περιήγησης σας ή στο υπολογιστή σας.
5. Κάντε χρήση μόνο συνδέσεων Wi-Fi που είναι ασφαλείς και πιστοποιημένες.
Τα 5 βασικά κριτήρια για την επιλογή του καλύτερου καζίνο παιχνιδιού με την εφαρμογή Cat Spins Casino
Επιλέξτε το καλύτερο καζίνο παιχνίδι με την εφαρμογή Cat Spins Casino στην Ελλάδα με βάση τα ακόλουθα 5 βασικά κριτήρια: 1 Ποσότητα παιχνιδιών, 2 Υψηλή ποιότητα γrafikών και ήχου, 3 Δωρεάν διαδικτυακές δωρεάν, 4 Εύκολη χρήση και πολυλογιστική εφαρμογή, 5 Ασφαλής και αξιόπιστος περιβάλλον.
Τι προσφέρει το Cat Spins Casino; Ένα νέο τρόπο για να παίξετε στα καζίνα
Το Cat Spins Casino είναι ένα νέο καζίνο που προσφέρει μοναδικές δυνατότητες παιγνίων στους παίκτες της Ελλάδας. Πρώτα, το Cat Spins Casino διαθέτει μια ενορία περίπλοκης και ευέλικτη πλατφόρμα παιγνίων, που σας επιτρέπει να παίξετε ό,τι θέλετε, όπου και όταν θέλετε.
Επιπλέον, το Cat Spins Casino προσφέρει ένα εκπληκτικό προγράμμα βονούς και προσφορών, το οποίο σας επιτρέπει να παίξετε με περισσότερη αξία.
Το Cat Spins Casino είναι επίσης γνωστό για την εxcellent υποστήριξη των παικτών και την ασφαλή περιβάλλον παιγνίων, το οποίο σας δίνει την ασφάλεια που αξίζει να επιλέξετε.
Τέλος, το Cat Spins Casino διαθέτει μια μεγάλη επιλογή παιχνιδιών, συμπεριλαμβανομένων παιχνιδιών καζίνο, παιχνιδιών σελίδας, παιχνιδιών σκαλών και περισσότερων, επιτρέποντάς σας να βρείτε το παιχνίδι που προσφέρει την εμπειρία παιγνίου που ανησυχείτε να βρείτε.
Πώς να ξεκινήσετε να παίζετε τα ρολίδια του Cat Spins Casino; Οδηγίες για την εγγραφή και την χρήση της εφαρμογής
Θέλετε να ξεκινήσετε να παίζετε τα ρολίδια του Cat Spins Casino; Ακολουθήστε οδηγίες για εγγραφή και χρήση της εφαρμογής:
1. Επισκεφθείτε την ιστοσελίδα Cat Spins Casino και επιλέξτε το κουμπί “Εγγραφή”.
2. Συμπληρώστε τα απαιτούμενα στοιχεία εγγραφής σας και επιβεβαιώστε την ηλικία σας.
3. Λαμβάνετε ένα παρόν σας με email για να επαληθευτοποιήσετε το λογαριασμό σας.
4. Κάντε κλικ στο σύνδεσμη που ληφθήκατε για να ολοκληρώσετε την εγγραφή σας.
5. Λήψη και εγκατάσταση της Cat Spins Casino εφαρμογής, και χρησιμοποιήστε τον λογαριασμό σας για να παίζετε τα ρολίδια του Cat Spins Casino.
Ένας από τους περίσσοτερους καλούς παίκτες μου είναι η Νίκος, ένας 35χρονος από την Αθήνα. Έχει παίξει στο Cat Spins Casino τα τελευταία μήνες και από τότε είναι παράξενα ευχαριστημένος. Το προσφέρει γρήγορα & ασφαλές καζίνο παιχνίδια και το χρήσιμο του είναι πολύ εύκολο.
Ένας άλλος παίκτης που συνιστάω είναι η Μαρία, μια 28χρονη γυναίκα από την Θεσσαλονίκη. Έχει παίξει στο Cat Spins Casino και της αρέσει πολύ το γρήγορο χρόνο φόρτωσης και την εύκολη χρήση. Έχει κάνει ήδη λίγες νίκες και της αρέσει πολύ το πρόγραμμα προσφορών του Cat Spins Casino.
Έτσι αν ψάχνετε για γρήγορα & ασφαλές καζίνο παιχνίδια, το Cat Spins Casino είναι η καλύτερη επιλογή σας!
Θέλετε να παίξετε ραντεβού με την τύχη στα καζίνο παιχνίδια; Διαθέτετε την εφαρμογή Cat Spins Casino και συμμετάσχετε σε παιχνίδια γρήγορα και ασφαλή.
Τι ανάγκη να εξόδευετε casino Catspins χρήματα για να παίξετε στα καζίνο; Με την Cat Spins Casino μπορείτε να αρχίσετε να παίζετε δωρεάν και να κερδίζετε πραγματικά χρήματα σήμερα.
Η Cat Spins Casino είναι ασφαλής και αξιόπιστη; Ναι, η Cat Spins Casino χρησιμοποιεί την τεχνολογία SSL για να προστατεύει τις πληροφορίες σας και να σας δώσει την ασφάλεια που αξίζει.
Τι περιμένετε; Λήψετε την εφαρμογή Cat Spins Casino τώρα και αρχίστε να παίζετε τα γρήγορα και ασφαλή καζίνο παιχνίδια σήμερα!